import Vue from 'vue'
import request from './request'
import { loadding_factory, delay_factory, status_factory } from './api_utils'
import qs from 'qs'
import store from '../../store'
import axios from 'axios'

const CancelToken = axios.CancelToken
const source = CancelToken.source()
// 配置API接口地址

// 组件销毁 终止请求
const abortAjax = (self, p) => {
  if (self && self.$vnode) {
    self.$m_destroyed && self.$m_destroyed.push(() => {
      p.reject(new Error('cancel'))
      source.cancel()
    })
  }
}
/*
* get 请求
*
* @param { string } url
* @param { object } data 要发送的数据 json 对象
* @returns  object
* */
export const $get = async function (url, params) {
  const userInfo = await $g.userInfoAsync()
  const companyInfo = await $g.companyInfoAsync()
  const p = request({
    method: 'GET',
    url,
    params: {
      userId: userInfo.id,
      companyId: companyInfo.id,
      ...params
    }
  })
  // 组件销毁 终止请求
  abortAjax(this, p)
  return p
}

/*
* post 请求
*
* @param { string } url
* @param { object } data 要发送的数据 json 对象
* @returns  object
* */
export const $post = async function (url, data) {
  const userInfo = await $g.userInfoAsync()
  const companyInfo = await $g.companyInfoAsync()
  const p = request({
    headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'},
    method: 'POST',
    url,
    data: qs.stringify({
      userId: userInfo.id,
      companyId: companyInfo.id,
      ...data
    })
  })
  // 组件销毁 终止请求
  abortAjax(this, p)
  return p
}

const $post_json = function (url, data) {
  return request({
    method: 'POST',
    url,
    data: {
      userId: store.getters.userInfo.id,
      companyId: store.getters.companyInfo.id,
      ...data
    }
  })
}

/*
* 有loading的 post or get 请求
*
* @param { string } url
* @param { object } data 要发送的数据 json 对象
* @returns  object
* */
export const $post_loading = loadding_factory($post)
export const $get_loading = loadding_factory($get)
const $post_json_loading = loadding_factory($post_json)
/*
* post or get 请求， 第一次访问延迟最少300毫秒, 给页面足够的动画过渡时间,尽量减少页面卡顿
*
* @param { string } url
* @param { object } data 要发送的数据 json 对象
* @returns  { object }
* */
const $post_delay_once = delay_factory($post)
const $get_delay_once = delay_factory($get)

/*
* post or get 请求, 根据请求状态设置this上的name为 null 请求中， true 请求成功， false 请求失败或异常
*
* @param { string } url
* @param { object } data 要发送的数据 json 对象
* @param {String} name 将要被设置上下文的属性名, null 请求中， true 请求成功， false 请求失败或异常
* @returns { object }
* */
const $post_states = status_factory($post)
const $get_states = status_factory($get)



/*
* 每 500 ms 查询一次,直到返回正确的结果,或执行次数用完
* 构造函数参数
* @param {Promise} 该Promise对象返回一个数组 [状态,数据], 状态为true 时结束轮询请求
* @param {Number} 最多循环次数
* @param {Number} 循环间隔时间(毫秒)
* */

export class QueryLoop {
  constructor (ajax, count = 10, time = 500) {
    this.count = count
    this.ajax = ajax
    this.time = time
  }

  // 开始轮询
  async start () {
    while (this.count > 0) {
      this.count--
      const result = await this.ajax()
      if (result[0] == true) {
        return result
      } else {
        await sleep(this.time)
      }
    }
    throw new Error(false)
  }

  // 结束轮询
  close () {
    this.count = 0
  }
}

Object.assign(Vue.prototype, {
  $get,
  $get_loading,
  $post,
  $post_loading,
  $post_json,
  $post_json_loading,
  $post_delay_once,
  $get_delay_once,
  $post_states,
  $get_states
})
